// import WxRequest from './request'
import WxRequest from 'mina-request'
import { clearStorage, getStorage } from './storage'
import { modal, toast } from './commonApi'

// 对 WxRequest 进行实例化,不管是这里还是外面都是用上面定义的构造方法
// 只要是对象即可，不会像java一样那么严格
const instance = new WxRequest({
  baseURL: 'https://gmall-prod.atguigu.cn/mall-api',
  timeout: 15000,
  isLoading: true
})
// 定义默认的请求拦截器
instance.interceptors.request = (config) => {
  // 从本地获取 token
  const token = getStorage('token')
  if (token) {
    // 如果存在 token ，则添加请求头
    config.header['token'] = token
  }
  return config
}
// 定义默认的响应拦截器
instance.interceptors.response = async (response) => {
  console.log(response)
  const { isSuccess, data } = response
  // 出现网络异常，正常来说只要请求能访问到服务器，isSuccess就会返回true
  // 不管后端的code是多少，如果返回的isSuccess是false，那么就说明请求没到服务器，网络出现异常
  if (!isSuccess) {
    toast({ title: '网络错误', icon: 'error' });
    // 抛出异常
    return Promise.reject(response);
  }
  // 如果isSuccess返回true，那么就需要对后端返回的code进行判断及做相应的业务
  switch (data.code) {
    // code 等于 200，后端返回的是请求成功的数据
    case 200: return data
    // 如果是208，那么说明没有token或者token失效
    case 208:
      const res = await modal({
        content: '鉴权失败，请重新登录',
        showCancel: false
      })
      if (res) {
        // 清除用户信息，如token
        clearStorage()
        // 跳转到登陆页面
        wx.navigateTo({
          url: '/pages/login/login'
        })
      }
      return Promise.reject(response)
    // 其他code做统一的异常封装  
    default:
      toast({
        title: '程序异常，请联系客服或稍后重试！'
      })
      // 抛出异常
      return Promise.reject(response)
  }
}


// 将 WxRequest 的实例通过模块化的方式暴露出去
export default instance